{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "99cae3da",
   "metadata": {},
   "source": [
    "## 1. 模型架构"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3492203b",
   "metadata": {},
   "source": [
    "### 1.1 编码器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d145af83",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "\n",
    "class Encoder(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size, num_layers):\n",
    "        super(Encoder, self).__init__()\n",
    "        self.lstm = nn.LSTM(input_size, hidden_size, num_layers) # LSTM模型\n",
    "    \n",
    "    def forward(self, x, hidden):\n",
    "        x, hidden = self.lstm(x, hidden)\n",
    "        return hidden  # 只需要输出hidden"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c862462",
   "metadata": {},
   "source": [
    "### 1.2 解码器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "637cb9dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Decoder(nn.Module):\n",
    "    def __init__(self, output_size, hidden_size, num_layers):\n",
    "        super(Decoder, self).__init__()\n",
    "        self.lstm = nn.LSTM(output_size, hidden_size, num_layers)  # LSTM模型\n",
    "        self.linear = nn.Linear(hidden_size, output_size)\n",
    "    \n",
    "    def forward(self, x, hidden):\n",
    "        x, state = self.lstm(x, hidden)\n",
    "        x = self.linear(x)\n",
    "        return x, state"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "03a029df",
   "metadata": {},
   "source": [
    "### 1.3. seq2seq模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ffee20e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Seq2Seq(nn.Module):\n",
    " \n",
    "    def __init__(self, encoder, decoder):\n",
    "        super().__init__()\n",
    "        self.encoder = encoder\n",
    "        self.decoder = decoder\n",
    " \n",
    "    def forward(self, encoder_inputs, decoder_inputs):\n",
    "        return self.decoder(decoder_inputs, self.encoder(encoder_inputs))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9cbd4a6b",
   "metadata": {},
   "source": [
    "## 2. 序列到序列模型简单实现"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7cb033d3",
   "metadata": {},
   "source": [
    "### 2.1 数据集准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f5911a8c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([['ei', 'si:', 'wai', 'ei', 'el', 'ef'],\n",
       "  ['em', 'ti:', 'ai', 'ai', 'ju:', 'ti:']],\n",
       " [['a', 'c', 'y', 'a', 'l', 'f'], ['m', 't', 'v', 'i', 'u', 't']])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "# 数据集生成\n",
    "soundmark = ['ei',  'bi:',  'si:',  'di:',  'i:',  'ef',  'dʒi:',  'eit∫',  'ai', 'dʒei', 'kei', 'el', 'em', 'en', 'əu', 'pi:', 'kju:',\n",
    "        'ɑ:', 'es', 'ti:', 'ju:', 'vi:', 'd∧blju:', 'eks', 'wai', 'zi:']\n",
    "\n",
    "alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',\n",
    "         'r','s','t','u','v','w','x','y','z']\n",
    "\n",
    "t = 10000 #总条数\n",
    "r = 0.9   #扰动项\n",
    "seq_len = 6\n",
    "src_tokens, tgt_tokens = [],[] #原始序列、目标序列列表\n",
    "\n",
    "for i in range(t):\n",
    "    src, tgt = [],[]\n",
    "    for j in range(seq_len):\n",
    "        ind = random.randint(0,25)\n",
    "        src.append(soundmark[ind])\n",
    "        if random.random() < r:\n",
    "            tgt.append(alphabet[ind])\n",
    "        else:\n",
    "            tgt.append(alphabet[random.randint(0,25)])\n",
    "    src_tokens.append(src)\n",
    "    tgt_tokens.append(tgt)\n",
    "src_tokens[:2], tgt_tokens[:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "7380696a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import Counter                                      #计数类\n",
    "\n",
    "flatten = lambda l: [item for sublist in l for item in sublist]      #展平数组\n",
    "\n",
    "# 构建词表\n",
    "class Vocab:\n",
    "    def __init__(self, tokens):\n",
    "        self.tokens = tokens  # 传入的tokens是二维列表\n",
    "        self.token2index = {'<bos>': 0, '<eos>': 1}  # 先存好特殊词元\n",
    "        # 将词元按词频排序后生成列表\n",
    "        self.token2index.update({\n",
    "            token: index + 2\n",
    "            for index, (token, freq) in enumerate(\n",
    "                sorted(Counter(flatten(self.tokens)).items(), key=lambda x: x[1], reverse=True))\n",
    "        }) \n",
    "        #构建id到词元字典\n",
    "        self.index2token = {index: token for token, index in self.token2index.items()}\n",
    " \n",
    "    def __getitem__(self, query):\n",
    "        # 单一索引\n",
    "        if isinstance(query, (str, int)):\n",
    "            if isinstance(query, str):\n",
    "                return self.token2index.get(query, 0)\n",
    "            elif isinstance(query, (int)):\n",
    "                return self.index2token.get(query, '<unk>')\n",
    "        # 数组索引\n",
    "        elif isinstance(query, (list, tuple)):\n",
    "            return [self.__getitem__(item) for item in query]\n",
    " \n",
    "    def __len__(self):\n",
    "        return len(self.index2token)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "427fe85c",
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.utils.data import DataLoader, TensorDataset\n",
    "\n",
    "#实例化source和target词表\n",
    "src_vocab, tgt_vocab = Vocab(src_tokens), Vocab(tgt_tokens)\n",
    "\n",
    "#增加结尾标识<eos>\n",
    "src_data = torch.tensor([src_vocab[line + ['<eos>']] for line in src_tokens])\n",
    "tgt_data = torch.tensor([tgt_vocab[line + ['<eos>']] for line in tgt_tokens])\n",
    "\n",
    "# 训练集和测试集比例8比2，batch_size = 16\n",
    "train_size = int(len(src_data) * 0.8)\n",
    "test_size = len(src_data) - train_size\n",
    "batch_size = 16\n",
    "\n",
    "train_loader = DataLoader(TensorDataset(src_data[:train_size], tgt_data[:train_size]), batch_size=batch_size)\n",
    "test_loader = DataLoader(TensorDataset(src_data[-test_size:], tgt_data[-test_size:]), batch_size=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ead58490",
   "metadata": {},
   "source": [
    "### 2.2 模型架构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "662f5eda",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义编码器\n",
    "class Encoder(nn.Module):\n",
    " \n",
    "    def __init__(self, vocab_size, ebd_size, hidden_size, num_layers):\n",
    "        super().__init__()\n",
    "        self.embedding = nn.Embedding(vocab_size, ebd_size)  # 将token表示为embedding\n",
    "        self.gru = nn.GRU(ebd_size, hidden_size, num_layers=num_layers)\n",
    " \n",
    "    def forward(self, encoder_inputs):\n",
    "        # encoder_inputs从(batch_size, seq_len)变成(batch_size, seq_len, emb_size)再调整为(seq_len, batch_size, emb_size)\n",
    "        encoder_inputs = self.embedding(encoder_inputs).permute(1, 0, 2)\n",
    "        output, hidden = self.gru(encoder_inputs)\n",
    "        # hidden 的形状为 (num_layers, batch_size, hidden_size)\n",
    "        # 最后时刻的最后一个隐层的输出的隐状态即为上下文向量\n",
    "        return hidden\n",
    "\n",
    "# 定义解码器\n",
    "class Decoder(nn.Module):\n",
    " \n",
    "    def __init__(self, vocab_size, ebd_size, hidden_size, num_layers):\n",
    "        super().__init__()\n",
    "        self.embedding = nn.Embedding(vocab_size, ebd_size)\n",
    "        # 拼接维度ebd_size + hidden_size\n",
    "        self.gru = nn.GRU(ebd_size + hidden_size, hidden_size, num_layers=num_layers)\n",
    "        self.linear = nn.Linear(hidden_size, vocab_size)\n",
    " \n",
    "    def forward(self, decoder_inputs, encoder_states):\n",
    "        '''\n",
    "            decoder_inputs 为目标序列偏移一位的结果, 由初始形状: (batch_size, seq_len)变为(batch_size, seq_len)\n",
    "            再调整为(batch_size, seq_len, emb_size) -> (seq_len, batch_size, emb_size)\n",
    "        '''\n",
    "        decoder_inputs = self.embedding(decoder_inputs).permute(1, 0, 2)\n",
    "        context = encoder_states[-1] # 上下文向量取编码器的最后一个隐层的输出\n",
    "        # context 初始形状为 (batch_size, hidden_size)，为下一步连接，需repeat为(seq_len, batch_size, hidden_size)形式 \n",
    "        context = context.repeat(decoder_inputs.shape[0], 1, 1)\n",
    "        output, hidden = self.gru(torch.cat((decoder_inputs, context), -1), encoder_states)\n",
    "        # logits 的形状为 (seq_len, batch_size, vocab_size)\n",
    "        logits = self.linear(output)\n",
    "        return logits, hidden\n",
    "\n",
    "# seq2seq模型\n",
    "class Seq2Seq(nn.Module):\n",
    " \n",
    "    def __init__(self, encoder, decoder):\n",
    "        super().__init__()\n",
    "        self.encoder = encoder\n",
    "        self.decoder = decoder\n",
    " \n",
    "    def forward(self, encoder_inputs, decoder_inputs):\n",
    "        return self.decoder(decoder_inputs, self.encoder(encoder_inputs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6b9235aa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 0.4887, -0.6628, -1.8760, -0.1039, -0.3671, -0.0545,  0.8259,  1.7120,\n",
       "          1.0536,  0.1105, -2.2157,  0.1826, -0.9814,  0.6896,  1.9313, -0.4203,\n",
       "          0.4704, -0.3540, -2.5149,  1.6691,  0.7668, -1.2259, -0.0838, -0.8457,\n",
       "         -0.7388,  0.7919],\n",
       "        [-0.3271, -0.9200,  1.4683, -1.0719, -0.9968, -0.5890,  0.0442, -0.4679,\n",
       "         -0.6279, -0.7677, -1.8178,  0.0872,  0.6651, -1.2833, -0.5265, -0.2333,\n",
       "          0.1615, -0.1019,  0.6508,  0.3404, -1.2946,  0.1573, -0.7420, -2.0256,\n",
       "          1.6652,  0.7278],\n",
       "        [-0.3090, -0.6615, -0.2852, -0.4307, -1.7267, -1.2491,  1.1952, -1.7489,\n",
       "          0.1471,  1.2763, -0.2151, -0.2278,  0.4850,  0.6540,  1.8243,  1.2390,\n",
       "          0.2089, -1.3072,  0.2947,  0.3472,  1.1848, -1.0279, -0.8024,  0.1165,\n",
       "         -0.0939,  0.0841],\n",
       "        [ 0.4887, -0.6628, -1.8760, -0.1039, -0.3671, -0.0545,  0.8259,  1.7120,\n",
       "          1.0536,  0.1105, -2.2157,  0.1826, -0.9814,  0.6896,  1.9313, -0.4203,\n",
       "          0.4704, -0.3540, -2.5149,  1.6691,  0.7668, -1.2259, -0.0838, -0.8457,\n",
       "         -0.7388,  0.7919],\n",
       "        [ 0.2450,  0.2942, -0.6478, -1.1449,  0.8370,  0.2286,  1.2670, -0.2990,\n",
       "         -1.2017,  1.9527,  0.2588, -0.7598,  1.4220, -1.9788, -1.0234,  0.5749,\n",
       "         -0.3605, -0.5907,  1.6407,  0.2505, -0.4432, -0.4119,  0.1512, -0.5205,\n",
       "         -2.3585,  1.8493],\n",
       "        [-0.6333,  0.7932,  0.2204,  0.8744,  1.3206, -1.3566, -1.3790, -1.0874,\n",
       "          1.1842, -0.2754, -0.7049, -1.1859,  0.9867,  1.7082, -0.3269, -0.6141,\n",
       "          0.4234,  0.2091, -0.7511,  1.0062,  0.3373, -0.3307, -1.2813,  0.2178,\n",
       "         -0.3695, -0.1869],\n",
       "        [ 1.6062, -0.9316,  0.7249,  0.1260,  1.2153,  0.7596, -1.4848,  0.4740,\n",
       "         -0.1286,  0.7063,  0.9402, -0.0867, -0.2397, -1.2286,  2.3666, -1.9981,\n",
       "          0.4441, -0.3359, -2.6526, -1.9506, -0.4288,  0.7680,  1.0715,  0.0294,\n",
       "         -0.0815, -1.4052]], grad_fn=<EmbeddingBackward0>)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ebd= nn.Embedding(26, 26)\n",
    "ebd(train_loader.dataset[0][0])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "49c4027b",
   "metadata": {},
   "source": [
    "### 2.3 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ca11a977",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 20/20 [03:35<00:00, 10.79s/it]\n"
     ]
    }
   ],
   "source": [
    "from tqdm import *\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 设置超参数\n",
    "lr = 0.001\n",
    "num_epochs = 20\n",
    "hidden_size = 128\n",
    "\n",
    "# 建立模型\n",
    "encoder = Encoder(len(src_vocab), len(src_vocab), hidden_size, num_layers=2)\n",
    "decoder = Decoder(len(tgt_vocab), len(tgt_vocab), hidden_size, num_layers=2)\n",
    "model = Seq2Seq(encoder, decoder)\n",
    "\n",
    "# 交叉熵损失及adam优化器\n",
    "criterion = nn.CrossEntropyLoss(reduction='none')\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n",
    "\n",
    "# 记录损失变化\n",
    "loss_history = []\n",
    "\n",
    "#开始训练\n",
    "model.train()\n",
    "for epoch in tqdm(range(num_epochs)):\n",
    "    for encoder_inputs, decoder_targets in train_loader:\n",
    "        encoder_inputs, decoder_targets = encoder_inputs, decoder_targets\n",
    "        # 偏移一位作为decoder的输入\n",
    "        # decoder的输入第一位是<bos>\n",
    "        bos_column = torch.tensor([tgt_vocab['<bos>']] * decoder_targets.shape[0]).reshape(-1, 1)\n",
    "        decoder_inputs = torch.cat((bos_column, decoder_targets[:, :-1]), dim=1)\n",
    "        # pred的形状为 (seq_len, batch_size, vocab_size)\n",
    "        pred, _ = model(encoder_inputs, decoder_inputs)\n",
    "        # decoder_targets 的形状为 (batch_size, seq_len)，我们需要改变pred的形状以保证它能够正确输入\n",
    "        # loss 的形状为 (batch_size, seq_len)，其中的每个元素都代表了一个词元的损失\n",
    "        loss = criterion(pred.permute(1, 2, 0), decoder_targets).mean()\n",
    "\n",
    "        # 反向传播\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        loss_history.append(loss.item())\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e45b12bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(loss_history)\n",
    "plt.ylabel('train loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e42be27",
   "metadata": {},
   "source": [
    "### 2.4 模型验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e60819ad",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.507\n"
     ]
    }
   ],
   "source": [
    "model.eval()\n",
    "translation_results = []\n",
    "\n",
    "correct = 0\n",
    "error = 0\n",
    "# 因为batch_size是1，所以每次取出来的都是单个句子\n",
    "for src_seq, tgt_seq in test_loader:\n",
    "    encoder_inputs = src_seq\n",
    "    hidden = model.encoder(encoder_inputs)\n",
    "    pred_seq = [tgt_vocab['<bos>']]\n",
    "    for _ in range(8):\n",
    "        # 一步步输出，decoder的输入的形状为(batch_size, seq_len)=(1,1)\n",
    "        decoder_inputs = torch.tensor(pred_seq[-1]).reshape(1, 1)\n",
    "        # pred形状为 (seq_len, batch_size, vocab_size) = (1, 1, vocab_size)\n",
    "        pred, hidden = model.decoder(decoder_inputs, hidden)\n",
    "        next_token_index = pred.squeeze().argmax().item()\n",
    "        if next_token_index == tgt_vocab['<eos>']:\n",
    "            break\n",
    "        pred_seq.append(next_token_index)\n",
    "    \n",
    "    # 去掉开头的<bos>\n",
    "    pred_seq = tgt_vocab[pred_seq[1:]]\n",
    "    # 因为tgt_seq的形状为(1, seq_len)，我们需要将其转化成(seq_len, )的形状\n",
    "    tgt_seq = tgt_seq.squeeze().tolist()\n",
    "    \n",
    "    # 需要注意在<eos>之前截断\n",
    "    if tgt_vocab['<eos>'] in tgt_seq:\n",
    "        eos_idx = tgt_seq.index(tgt_vocab['<eos>'])\n",
    "        tgt_seq = tgt_vocab[tgt_seq[:eos_idx]]\n",
    "    else:\n",
    "        tgt_seq = tgt_vocab[tgt_seq]\n",
    "    translation_results.append((' '.join(tgt_seq), ' '.join(pred_seq)))\n",
    "    \n",
    "    for i in range(len(tgt_seq)):\n",
    "        if i >= len(pred_seq) or pred_seq[i] != tgt_seq[i]:\n",
    "            error += 1\n",
    "        else:\n",
    "            correct += 1\n",
    "\n",
    "print(correct/(correct+error))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f4be7871",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('f d i f h h', 'f d i f r h'),\n",
       " ('r g d f x z', 'r m f d s n'),\n",
       " ('c v v r l q', 'c v r a l'),\n",
       " ('q b f n v x', 'q v f n d e'),\n",
       " ('q b x y p y', 'q b x j t b'),\n",
       " ('o c c o o t', 'o c o p w'),\n",
       " ('n u b r b x', 'n u b r t w'),\n",
       " ('b t w z y q', 'b t w s q'),\n",
       " ('z c c i s w', 'z c p g w t'),\n",
       " ('o t w t c t', 'o v w s c n'),\n",
       " ('y o f z y c', 'y o f z o c'),\n",
       " ('i e z m d d', 'i e m z d p'),\n",
       " ('b n o a l m', 'b n a o l p'),\n",
       " ('s y d i u k', 's y u i s c'),\n",
       " ('n r w p s e', 'y r p r a p'),\n",
       " ('z i l x v i', 'z c l i v'),\n",
       " ('n w g h l n', 'w n g h r c'),\n",
       " ('b b o o b s', 'b b o r a b'),\n",
       " ('x b t y h n', 'x b y h n c'),\n",
       " ('z f l r d w', 'z f l r o w'),\n",
       " ('e m q d m i', 'e q g d m h'),\n",
       " ('v f s t v y', 'v f s t v b'),\n",
       " ('u x k e a s', 'u x k a e p'),\n",
       " ('a o u i i y', 'a o i x v q'),\n",
       " ('o d c i h p', 'o d q i c h'),\n",
       " ('f o a z v t', 'f o a t d x'),\n",
       " ('i b i s a t', 'i b o j t b'),\n",
       " ('g e s t f s', 'g s e o r x'),\n",
       " ('g g t u h q', 'g h u u h g'),\n",
       " ('p v t b j p', 'p v t b j p'),\n",
       " ('e o n t h s', 'a o l n g p'),\n",
       " ('w y q s v m', 'w r y s v p'),\n",
       " ('g l c s f b', 'g c l s d x'),\n",
       " ('v u j y y n', 'v y j r g i'),\n",
       " ('y h b c f e', 'y h b y c w'),\n",
       " ('r b x k d g', 'r b x d c j'),\n",
       " ('p n l e u n', 'p z n e z q'),\n",
       " ('u b c d r i', 'u z c d r'),\n",
       " ('j o e x k n', 'j o b c u g'),\n",
       " ('p j t a u l', 'q j t b u c'),\n",
       " ('b v n y g f', 'b v i n v f'),\n",
       " ('i g r q i g', 'i g r q i c'),\n",
       " ('e y q m i b', 'e y q m i z'),\n",
       " ('z o r f n v', 'z g r f o u'),\n",
       " ('e r t k p j', 'e i k m k'),\n",
       " ('r k s j s i', 'c k s k x z'),\n",
       " ('m g g b b e', 'm g d x g e'),\n",
       " ('l i t g w m', 'l i t g w'),\n",
       " ('x m v r x o', 'x v u r x o'),\n",
       " ('i v c h f o', 'i v c y h o'),\n",
       " ('n e h z y g', 'a z h l g d'),\n",
       " ('t q i o g v', 't q i o v g'),\n",
       " ('p w e w g o', 'p w e m g'),\n",
       " ('g f e u v h', 'g f u c h h'),\n",
       " ('p y a i o j', 'p y a i r h'),\n",
       " ('e r v a g a', 'e r v a h q'),\n",
       " ('e n n b x v', 'e n s x r'),\n",
       " ('e i s u r k', 'e e s u r c'),\n",
       " ('x g h h l e', 'x y h c l b'),\n",
       " ('x z v m a q', 'x z v m u o'),\n",
       " ('t k s q x c', 't k s x c c'),\n",
       " ('y q u o y r', 'y q u n o e'),\n",
       " ('w h v w x i', 'w h v f w s'),\n",
       " ('r w g g w p', 'r g g w g p'),\n",
       " ('f d q i m g', 'f q i m q g'),\n",
       " ('t i r h g m', 't s n h g c'),\n",
       " ('o o g k m j', 'o o g p w v'),\n",
       " ('w o g b k s', 'p o g p r v'),\n",
       " ('b v v g o j', 'b v v s o n'),\n",
       " ('h v x c i j', 'h v x c i j'),\n",
       " ('x a r v n l', 'x a v b n k'),\n",
       " ('k o r z g s', 'k o r z c p'),\n",
       " ('f z p e m j', 't z p v m j'),\n",
       " ('t r c w n g', 't r c w n p'),\n",
       " ('s o w x c q', 's k o x r c'),\n",
       " ('m h a g e q', 'm h a g u x'),\n",
       " ('r e s b x s', 'r e s b t s'),\n",
       " ('h a u i k x', 'h a u i s t'),\n",
       " ('p u t s u t', 'p k s u t e'),\n",
       " ('z c d y i f', 'c d k y q f'),\n",
       " ('u j u e o f', 'x j r e d c'),\n",
       " ('g j p q f s', 'g m q p r v'),\n",
       " ('o n c b d o', 'o n l d g f'),\n",
       " ('v q p b x r', 'v q p r v p'),\n",
       " ('x q d n y v', 'x q d n c d'),\n",
       " ('p f p e g j', 'p p f c e q'),\n",
       " ('d x z s b i', 'd x z s d e'),\n",
       " ('q r t z y x', 'q r t z y b'),\n",
       " ('l r k y g o', 'l r s m g e'),\n",
       " ('i t x c s i', 'i i s c z i'),\n",
       " ('g e t v l d', 'g e a l p d'),\n",
       " ('b k j q a h', 'k j k x y k'),\n",
       " ('x s j v q x', 'x s j c q j'),\n",
       " ('a b d o e u', 'a b o d e s'),\n",
       " ('r o l r j n', 'r m s j r q'),\n",
       " ('f d o b n f', 'f g o b r u'),\n",
       " ('r m d f u h', 'o d m h u r'),\n",
       " ('g v u c u q', 'v a u r u q'),\n",
       " ('l p e z w t', 'p l e z o t'),\n",
       " ('q d l s y o', 'q d l s o m'),\n",
       " ('j m e w r k', 'j m e b r k'),\n",
       " ('l x w d b p', 'l x w d o p'),\n",
       " ('f p w u q l', 'd p w u q k'),\n",
       " ('d m y n h l', 'd q n h n x'),\n",
       " ('l b q c k l', 'l b j c j b'),\n",
       " ('h t m q g q', 'h g m f q n'),\n",
       " ('g b c j c e', 'g b c j c h'),\n",
       " ('e g w b b f', 'm g w q g f'),\n",
       " ('t p x c q a', 't r x c u g'),\n",
       " ('s n n q c n', 's n n q c'),\n",
       " ('u z r t p c', 'u p r p t c'),\n",
       " ('z a h y h i', 'z h a y h i'),\n",
       " ('q x p n z i', 'j x p y g i'),\n",
       " ('m v o j g z', 'm v o j g z'),\n",
       " ('l z o i h w', 'l z o i r t'),\n",
       " ('v k m q c i', 'k m q m c w'),\n",
       " ('l q u w i q', 'l l u i s h'),\n",
       " ('u y d l z a', 'u r d l s o'),\n",
       " ('d j g k v f', 'd f g k x f'),\n",
       " ('c o y b f s', 'c o b y f w'),\n",
       " ('w f g v n k', 'w f g v p r'),\n",
       " ('x i l q u k', 'x i l q k'),\n",
       " ('s i g d g r', 's i c g d'),\n",
       " ('e v y l g o', 'e v y l k o'),\n",
       " ('w d u m s m', 'h q u m s'),\n",
       " ('t t d d k w', 't t d s w k'),\n",
       " ('p v d g g o', 'p d v g p r'),\n",
       " ('w w m e k n', 'w q c e o r'),\n",
       " ('f k h s d a', 't k s d s'),\n",
       " ('t z w e y k', 'b w z f y e'),\n",
       " ('m v b l m m', 'v f b l a m'),\n",
       " ('n c y m g n', 'c c y f g a'),\n",
       " ('g l c z q r', 'f c l z q r'),\n",
       " ('s d b w o c', 'y d b w o c'),\n",
       " ('a g z e l f', 'g g e d t b'),\n",
       " ('q b n t v z', 'q y x t n z'),\n",
       " ('o l e y a x', 'o l e c x a'),\n",
       " ('p u g s d w', 'p g u s d t'),\n",
       " ('w s s h f t', 'w d s l d p'),\n",
       " ('h g q r l a', 'q q i r l a'),\n",
       " ('z r x i r b', 'z r x i r e'),\n",
       " ('j g k y j j', 'g j y k h n'),\n",
       " ('s h d n l a', 's h n u l s'),\n",
       " ('p n h u b w', 'n u h y b w'),\n",
       " ('n h v p k z', 'n v s p v l'),\n",
       " ('v b a s w g', 'v l a s w o'),\n",
       " ('o t y j u m', 'o t j y i f'),\n",
       " ('g f l i h w', 'g f o i r c'),\n",
       " ('m f x n m b', 'm p v n m h'),\n",
       " ('v d z n u u', 'v z d q n e'),\n",
       " ('s k r f a o', 's k r f d o'),\n",
       " ('z u q q c a', 'z u q c p'),\n",
       " ('j z c j l u', 'j z c l j r'),\n",
       " ('p d v r o a', 'p d v r d p'),\n",
       " ('f f a m h n', 'f y f o x a'),\n",
       " ('w k v n n x', 'w b v n t z'),\n",
       " ('i m e u j e', 'i m c e g'),\n",
       " ('e l d g z o', 'e m l d g k'),\n",
       " ('p a q w q w', 'a p q v q w'),\n",
       " ('y a e a t s', 'm a e a l c'),\n",
       " ('x k q h u q', 'w c q h u d'),\n",
       " ('d f s h o l', 'd f s w o l'),\n",
       " ('v i a q y s', 'v i a q u s'),\n",
       " ('t a e e m q', 'z t e f x a'),\n",
       " ('d l f s r v', 'd x s r d e'),\n",
       " ('w d o j q g', 'w d o q x g'),\n",
       " ('b z p x u c', 'o z p r v'),\n",
       " ('n s h b w q', 'n s h c b n'),\n",
       " ('x d c t a k', 'z d c h a n'),\n",
       " ('z w r b l i', 'e z d l r i'),\n",
       " ('l s p j w q', 'l k p j i a'),\n",
       " ('v p o v q d', 'v p o v q h'),\n",
       " ('a w s r u z', 'a w s r u l'),\n",
       " ('v d d h v c', 'n d m z c f'),\n",
       " ('i m z e v r', 'd d h u h c'),\n",
       " ('y n s j c x', 'y s n j d t'),\n",
       " ('g w p u j e', 'g w p v r x'),\n",
       " ('h t k w k o', 'h t w k m a'),\n",
       " ('o d d s b n', 'o d d s x h'),\n",
       " ('v p n t e r', 'v k t g f s'),\n",
       " ('y z g q f m', 'y z q g j m'),\n",
       " ('o i g j x h', 'o i q j h'),\n",
       " ('s a q k f k', 's a q r k x'),\n",
       " ('b y w c v l', 'b y w s v c'),\n",
       " ('l z m a x p', 'l z m a p l'),\n",
       " ('u e w r n j', 'e u e d n p'),\n",
       " ('r o h t i u', 'r r h o w k'),\n",
       " ('z v w v w w', 'z c y w g w'),\n",
       " ('f x q y s m', 'f x k s x g'),\n",
       " ('o s d j t u', 'o s d t q w'),\n",
       " ('c h y w h d', 'c h y w h'),\n",
       " ('h z i u n t', 'h z v i e n'),\n",
       " ('f x m b y y', 'f x f b y p'),\n",
       " ('q x w s a c', 'q w x s c a'),\n",
       " ('y m f d a k', 'y f m d k x'),\n",
       " ('i f c q o w', 'i f c q o w'),\n",
       " ('x y x n r t', 'x y x r t c'),\n",
       " ('y y p p r p', 'y h f r u s'),\n",
       " ('y h a t h y', 'k k a t h x'),\n",
       " ('y h w x v y', 'y h w v g a'),\n",
       " ('u p j c s n', 'u p j y b p'),\n",
       " ('r b w y t z', 'r g w t b'),\n",
       " ('p x r v d h', 'p x r v d h'),\n",
       " ('w u l l u e', 'w u l q e x'),\n",
       " ('m q u f m m', 'e q u c d m'),\n",
       " ('t y o l d p', 't y o l d p'),\n",
       " ('t u j c z t', 't v j z c x'),\n",
       " ('n h j s r v', 'w h b k w c'),\n",
       " ('h b c a x z', 'h b c o w'),\n",
       " ('b o d y x t', 'b k d y x i'),\n",
       " ('l q k u o k', 'm l v u o k'),\n",
       " ('f k g c i l', 'o k g g i l'),\n",
       " ('k n v a u u', 'k g f a u'),\n",
       " ('u i r e l t', 'u g k y e x'),\n",
       " ('o z e j d g', 'f z e d j p'),\n",
       " ('v l b h r l', 'v l b r h k'),\n",
       " ('v q t a w w', 'v q t z w h'),\n",
       " ('z v g p x h', 'z s g k x h'),\n",
       " ('n y x f v k', 'n g x y f k'),\n",
       " ('d s t k m t', 'r s i m k'),\n",
       " ('r o e h j b', 'r o v l g m'),\n",
       " ('z z l n r w', 'j z l r t w'),\n",
       " ('u d p o s i', 'u d p o v a'),\n",
       " ('m a j c t g', 'm j a c x g'),\n",
       " ('r z w w z g', 'r m z w h g'),\n",
       " ('z o c w j t', 'z c l d t e'),\n",
       " ('n m p s h s', 'n n s v l s'),\n",
       " ('q c x z r w', 'q c z j r t'),\n",
       " ('a g t i e t', 'a g i t k'),\n",
       " ('l c o u h y', 'l c o j l h'),\n",
       " ('m m u c h d', 'm m u d h t'),\n",
       " ('s o x y k z', 's x o y k x'),\n",
       " ('i f l h a k', 'i f l o u k'),\n",
       " ('f i v n r g', 'f i v r n g'),\n",
       " ('b r q w e f', 'b r q w r'),\n",
       " ('i g m m u k', 'i g m m k u'),\n",
       " ('o v r h p f', 'o v s r g e'),\n",
       " ('e l b a c k', 'e l a b c u'),\n",
       " ('t q n s r y', 't q s n o b'),\n",
       " ('c o k i d q', 'c i k h y i'),\n",
       " ('g w q o g g', 'g w o q g n'),\n",
       " ('b r s u d x', 'i r s b u c'),\n",
       " ('b q h l k e', 'b q l o z e'),\n",
       " ('p d j i i h', 'p d j i y h'),\n",
       " ('n a z u q j', 'n a z l q f'),\n",
       " ('y x x k i z', 'h x x o r v'),\n",
       " ('s i h b m y', 's i h p d y'),\n",
       " ('e k h d o y', 'e c s d l p'),\n",
       " ('d n g f g k', 'd b g f r k'),\n",
       " ('b n w w m s', 'y q w m h'),\n",
       " ('y j t o t k', 'y j t o r p'),\n",
       " ('m d c x j c', 'm n x j c'),\n",
       " ('t o z w t e', 'n u z o x e'),\n",
       " ('f u r r y q', 'f u r f g i'),\n",
       " ('t w r f g t', 't e r d t n'),\n",
       " ('a w x a m z', 'a w a x g l'),\n",
       " ('o o n q j e', 'o j o q j e'),\n",
       " ('z u l u d w', 'x u l b v'),\n",
       " ('a j j m x z', 'a t j m h p'),\n",
       " ('o t f b r q', 'o g f r q g'),\n",
       " ('i j q m v a', 'i j q v d'),\n",
       " ('c g z v y c', 'c g z q y c'),\n",
       " ('a t c i n u', 'a t i x o k'),\n",
       " ('o h y r v o', 'c h y r t w'),\n",
       " ('j k u m v f', 'i k y t f d'),\n",
       " ('i f p p n o', 'i p f p n a'),\n",
       " ('x d t z p l', 'x d t z p l'),\n",
       " ('x v h u a o', 'x v h u x o'),\n",
       " ('v h z f z z', 'v h u f r z'),\n",
       " ('o o s y h h', 'o o s y h p'),\n",
       " ('b q b l u q', 'b v b x u t'),\n",
       " ('k y u t s l', 'k y u t d'),\n",
       " ('w b g b j k', 'w b g c f w'),\n",
       " ('i k v e j k', 'i c e d o'),\n",
       " ('v m p c x z', 'q m p c j i'),\n",
       " ('x a w t j l', 'x a w t j p'),\n",
       " ('p l c r u n', 'p l c r p c'),\n",
       " ('k d z n l u', 'k m z n i z'),\n",
       " ('m v g q c s', 'm v q g k x'),\n",
       " ('t l u k y c', 't o e r d p'),\n",
       " ('h o q q l d', 'h o q l k d'),\n",
       " ('f n d l l c', 'f n f z c p'),\n",
       " ('i w i t t q', 'i w i t u'),\n",
       " ('s v n q c k', 's v q r m k'),\n",
       " ('n e q c l x', 'n e q c e'),\n",
       " ('g f j a o e', 'g f j a r'),\n",
       " ('c h l t t u', 'c h t s t b'),\n",
       " ('d z j p o r', 'd z j o h a'),\n",
       " ('n r l u o k', 'n r l o u g'),\n",
       " ('j h r r b n', 'e h r b o c'),\n",
       " ('y t t c v z', 'y t l w g'),\n",
       " ('k j g f e i', 'k g j f e i'),\n",
       " ('z z s e q e', 'z z s e q f'),\n",
       " ('o f d o h h', 'o d f z d t'),\n",
       " ('t v b y g z', 't v a y w t'),\n",
       " ('j v s b j c', 'j s v b s c'),\n",
       " ('u z p m w g', 'u u p m w g'),\n",
       " ('f e k d p b', 'f r v d p n'),\n",
       " ('h d o c l k', 'h d o c d k'),\n",
       " ('i o z h b q', 'i o z f q k'),\n",
       " ('a g s w y c', 'a g s w d g'),\n",
       " ('y v a n t b', 'y v a r x p'),\n",
       " ('q j e w v j', 'q j e c u'),\n",
       " ('y v n l x m', 'c v n t r'),\n",
       " ('q j w s z h', 'q j a r s i'),\n",
       " ('h z c u x i', 'h g l x g'),\n",
       " ('n e y o u v', 'n g g y o c'),\n",
       " ('n d k l f a', 'n d k l f d'),\n",
       " ('b x n q w v', 'b x n q v c'),\n",
       " ('o n c j b l', 'o n s x g l'),\n",
       " ('e y q f a j', 'e q f a q r'),\n",
       " ('a s t x w i', 'a s t c w'),\n",
       " ('l l s s d a', 'l l s d s l'),\n",
       " ('i c m a n o', 'i c m a l o'),\n",
       " ('o f h h n h', 'o d f h a q'),\n",
       " ('h r g k k y', 'r h g k j n'),\n",
       " ('l r b d s b', 'g z h d s r'),\n",
       " ('z r s a z e', 'z r s v i s'),\n",
       " ('p d v w b d', 'p a d v b w'),\n",
       " ('g y i o r n', 'g q i f o c'),\n",
       " ('s l s e b a', 's n s v b o'),\n",
       " ('p v v j w k', 'p i v s q k'),\n",
       " ('s i v d s v', 's i s d v q'),\n",
       " ('y a k q l g', 'y l k q l g'),\n",
       " ('v g d f x l', 'v g f d x n'),\n",
       " ('p z a j b q', 'p z b k t e'),\n",
       " ('o y s d l k', 'o y s d c k'),\n",
       " ('z t v u u j', 'z t y u h p'),\n",
       " ('p e t x v x', 'p e t m v p'),\n",
       " ('g u z w a u', 'g u z w o b'),\n",
       " ('s r h x k i', 's r x h a'),\n",
       " ('k m a c v z', 'k a t v b t'),\n",
       " ('h n m s x x', 'h n m s g t'),\n",
       " ('o k t s r a', 'o k s n s e'),\n",
       " ('p g w s m f', 'p g w s m b'),\n",
       " ('a p h v y d', 'a p h c p'),\n",
       " ('d c w i v l', 'd c g v p l'),\n",
       " ('l c v x i a', 'l c c p w a'),\n",
       " ('k b e q c y', 'k b y x c h'),\n",
       " ('c x z i n m', 'x s i d l g'),\n",
       " ('z r z p g r', 'z r z g p r'),\n",
       " ('v o z n a s', 'v o z t b a'),\n",
       " ('u t y a c u', 'u t s c i p'),\n",
       " ('t r m a d b', 't r m a x q'),\n",
       " ('i s t t m h', 'i g t m h'),\n",
       " ('v c q q s n', 'v c q q j n'),\n",
       " ('f t e w y n', 'f t e d n p'),\n",
       " ('b u k a i g', 'c u k z m g'),\n",
       " ('w a u p b e', 'w a q p r'),\n",
       " ('d y v n c z', 'd y v c z'),\n",
       " ('n e w y g x', 'n e z m t'),\n",
       " ('o b p k h r', 'h b x k h r'),\n",
       " ('y f u m q a', 'y f u b m p'),\n",
       " ('u n h w l l', 'u n h w x'),\n",
       " ('q r e i d h', 'q r e i d h'),\n",
       " ('h d q g h l', 'h q d f q k'),\n",
       " ('f p j r x p', 'i p j r t'),\n",
       " ('n z j m f o', 'n p j m h o'),\n",
       " ('c g c x a u', 'c g n o c u'),\n",
       " ('y d e d k c', 'b d f k d c'),\n",
       " ('c w q u p c', 'c q f q k'),\n",
       " ('h u o l j e', 'h u o l g w'),\n",
       " ('o j u y a p', 'o j u i s'),\n",
       " ('a h s f z n', 'a h f h g n'),\n",
       " ('j k h i t h', 'j k z m e p'),\n",
       " ('i h e j r s', 'i v e r d'),\n",
       " ('o h n b b t', 'o c n d t e'),\n",
       " ('i q l k g k', 'i q s l k i'),\n",
       " ('h w q l h m', 'h n l h k'),\n",
       " ('u m r g s d', 'u m r g p w'),\n",
       " ('i i e b y g', 'i i e n d q'),\n",
       " ('y r u m u e', 'y r u m g p'),\n",
       " ('g p o c e m', 'g p c k g x'),\n",
       " ('s q r v f e', 's q r v f'),\n",
       " ('a s i h u m', 'a i s h q w'),\n",
       " ('s v p i q e', 's v p r q e'),\n",
       " ('s o x i l g', 's o x u i g'),\n",
       " ('l a t i i a', 'l a t d i p'),\n",
       " ('a a k s v u', 'a a k o s u'),\n",
       " ('s u r e m d', 'z u r e o d'),\n",
       " ('c c y d t s', 'c d y d c s'),\n",
       " ('c d x a q j', 'c d a q j c'),\n",
       " ('m j t w a s', 'g j t k d s'),\n",
       " ('p w u h g n', 'p w u b g'),\n",
       " ('q x q g z o', 'q x q e z o'),\n",
       " ('t i b d k w', 't i b d k'),\n",
       " ('r e l z b a', 'r y p w d a'),\n",
       " ('f k f m x a', 'f k u b s w'),\n",
       " ('f y f l j k', 'f y f l r k'),\n",
       " ('k u a s l y', 'k u a s l c'),\n",
       " ('w y e p i t', 'w y e p o c'),\n",
       " ('v z h s h o', 'v o h s h d'),\n",
       " ('x c h r f z', 'x c h r f p'),\n",
       " ('y w a j k r', 'y s a w r'),\n",
       " ('j o g w c m', 'j o g k w g'),\n",
       " ('g m o k o q', 'g h m o k q'),\n",
       " ('d j s o c g', 'd j s c q k'),\n",
       " ('k x f u t k', 'k x f u i t'),\n",
       " ('m o y x q v', 'm o n x u q'),\n",
       " ('h g b s p v', 'h g b s k v'),\n",
       " ('n j i m p k', 'n i j q t'),\n",
       " ('y j x v l g', 'w p c j l i'),\n",
       " ('m d u u l b', 'd m u z x p'),\n",
       " ('y m f b n p', 'y j m b n p'),\n",
       " ('q v r r u d', 'q v r s u'),\n",
       " ('a x w f n b', 'a x w f x g'),\n",
       " ('f e n w n v', 'f e n w a g'),\n",
       " ('v z u e q b', 'v z u d e'),\n",
       " ('c p v l c g', 'c p s v l'),\n",
       " ('r j v d f d', 'q j v d f o'),\n",
       " ('i k s z j v', 'i k s z v'),\n",
       " ('e n w w j d', 'e n w w j'),\n",
       " ('b q k d k u', 'b q k d k a'),\n",
       " ('i g a g y y', 'i g a f q u'),\n",
       " ('j j f m v q', 'z j f m k v'),\n",
       " ('x g r z a t', 'x r o b a x'),\n",
       " ('e r n l u a', 'e r n s v t'),\n",
       " ('u e t z g w', 'u l e z d'),\n",
       " ('s c b o z y', 's c b o v l'),\n",
       " ('v j e d g o', 'v j l d g k'),\n",
       " ('k u x z w g', 'k u x z m g'),\n",
       " ('e m u w b d', 'e m u b x p'),\n",
       " ('t p c e q t', 't p c u q'),\n",
       " ('d l h m i c', 'd l h m b c'),\n",
       " ('u z j n c u', 'u z j n k c'),\n",
       " ('w t l n i e', 'w t l n i v'),\n",
       " ('w s v g o x', 'w s v g o f'),\n",
       " ('t o q r z g', 't m o r g x'),\n",
       " ('a n f r f b', 'a n s f x'),\n",
       " ('n c y l z t', 'n c u z t p'),\n",
       " ('c f r s d n', 'c f s d n'),\n",
       " ('y q w m h o', 'y q w m h o'),\n",
       " ('u d j h o p', 'u d j h p r'),\n",
       " ('z v i s e y', 'z v x s e y'),\n",
       " ('l r b m d u', 'l r w b d p'),\n",
       " ('w q x v n j', 'z q v t r a'),\n",
       " ('n x r x o r', 'n z x g r d'),\n",
       " ('k l u b g i', 'l n u b g i'),\n",
       " ('l o w p m n', 'l w z p m a'),\n",
       " ('i u c f f o', 'i u c f o'),\n",
       " ('n k l v p b', 'n k l v p'),\n",
       " ('b h r n r x', 'b h r j n e'),\n",
       " ('s t o j j r', 's t o j l h'),\n",
       " ('g o r v g i', 'g g f o x g'),\n",
       " ('l j s q f r', 'l l j l f r'),\n",
       " ('l s p j f f', 'l x j p y v'),\n",
       " ('m y w v j c', 'm y w j v c'),\n",
       " ('y y v c e r', 'y v c u r e'),\n",
       " ('c c p v x w', 'c p c s x i'),\n",
       " ('h y k e h u', 'h y k e h g'),\n",
       " ('u s a u d o', 'u s a u d'),\n",
       " ('u c n a d o', 'u c n a d'),\n",
       " ('g k o x p o', 'h k o x j n'),\n",
       " ('u l o o t j', 'u o l o v p'),\n",
       " ('n z n f c q', 'n z n i q c'),\n",
       " ('z w v i p u', 'z w v i s u'),\n",
       " ('c d d h e k', 'c d d c h k'),\n",
       " ('b y i n o r', 'b b i c r f'),\n",
       " ('i w r u d q', 'i w y f w q'),\n",
       " ('k a g u f b', 'k a g x y h'),\n",
       " ('l u u y y e', 'l u v y t e'),\n",
       " ('n h n b o v', 'n n h b r v'),\n",
       " ('a p j d s q', 'a a j q s r'),\n",
       " ('k m s r w b', 'k s s w b x'),\n",
       " ('c u i e g i', 'c u i f g i'),\n",
       " ('v i o y d s', 'v i o d e h'),\n",
       " ('o s z i e h', 'o d u i r d'),\n",
       " ('d x t e i o', 'd x k h a i'),\n",
       " ('h c q s m d', 'h c l m j p'),\n",
       " ('a o x n o m', 'a o x r g t'),\n",
       " ('m i q j p i', 'm i q j l h'),\n",
       " ('v r p t f z', 'v r p r m z'),\n",
       " ('e f s p w x', 'e f s s w'),\n",
       " ('c f y y n p', 'c f y g x r'),\n",
       " ('d p y m x u', 'd p y w d p'),\n",
       " ('l w v a j a', 'g w u j d'),\n",
       " ('z m l h c s', 'z x l h c a'),\n",
       " ('s x p k h f', 's x k i r'),\n",
       " ('m y q x z j', 'm y q q w g'),\n",
       " ('a g w w j c', 'g n w j c g'),\n",
       " ('b w a a p a', 'b z a p a i'),\n",
       " ('u w i e e g', 'u w i y q w'),\n",
       " ('f q i w v a', 'f q o w d p'),\n",
       " ('a n e r x c', 'a n e r v p'),\n",
       " ('h w j k x u', 'g h j w k'),\n",
       " ('e w y a m x', 'e w y a x p'),\n",
       " ('e y m e b b', 'e y e m s e'),\n",
       " ('t w r k v y', 't r w k y p'),\n",
       " ('v c g r z d', 'v c g r a i'),\n",
       " ('s c k f q r', 's c f n d h'),\n",
       " ('l r m r j s', 'l r i r x s'),\n",
       " ('g w d v i q', 'h w r v i p'),\n",
       " ('w u l b t a', 'w u b t a c'),\n",
       " ('f r k o j b', 'f r k o d x'),\n",
       " ('y m a n p p', 'y m a q p w'),\n",
       " ('j c m j e b', 'c j m e s f'),\n",
       " ('c b c m m p', 'c b d v m o'),\n",
       " ('t s r m r u', 'i s k m b u'),\n",
       " ('e o d i e x', 'e o i d s f'),\n",
       " ('h m c r p i', 'h c s d t w'),\n",
       " ('q c t s d w', 'q c t s d'),\n",
       " ('e x n x t i', 'e x n j i'),\n",
       " ('q a u u h s', 'q u n d t h'),\n",
       " ('i g f z g i', 'i g f z g'),\n",
       " ('y s x t l d', 'y o x y c h'),\n",
       " ('f c h i j c', 'f c q j c o'),\n",
       " ('u l k o z w', 'u l k o z g'),\n",
       " ('f m p f y s', 'f i f p y c'),\n",
       " ('h m g z i g', 'h m m z i v'),\n",
       " ('z s p h h u', 'z s p h k'),\n",
       " ('d s l z e q', 'd s r p i e'),\n",
       " ('d v b s o e', 'd v c s o u'),\n",
       " ('k o d g g j', 'k o v y p j'),\n",
       " ('r s d n v i', 'r s d x n i'),\n",
       " ('i r s p w h', 'i r s p w h'),\n",
       " ('t s c e q f', 't s x e o c'),\n",
       " ('t s y q b n', 't s y q r w'),\n",
       " ('l x h n m s', 'l w h m a s'),\n",
       " ('f a j m u p', 'f a j m q r'),\n",
       " ('s e h q v o', 's e q m l o'),\n",
       " ('y z p p m j', 'y z i p r v'),\n",
       " ('i l r v j n', 'i r v j r'),\n",
       " ('s r f j i q', 's r f r g i'),\n",
       " ('v n x e l a', 'v n f a x'),\n",
       " ('e n u m y c', 'e n u t b a'),\n",
       " ('q e b s y z', 'q e b s y p'),\n",
       " ('v u q v j c', 'v u q v a c'),\n",
       " ('i k r s j e', 'i k r s z i'),\n",
       " ('r o t o m f', 'r o t g m f'),\n",
       " ('t q a y t k', 'w q z y t h'),\n",
       " ('c p c y g s', 's p d y g'),\n",
       " ('d z d q f z', 'm r q f d z'),\n",
       " ('j n z l i z', 'j x z d i p'),\n",
       " ('j b b x a k', 'j b x f k a'),\n",
       " ('d h p o s o', 'd h q f o s'),\n",
       " ('l t z b l x', 'l t b o e l'),\n",
       " ('s q t d b f', 's q t d f s'),\n",
       " ('b t b h l l', 'b o l h g l'),\n",
       " ('f k o n j e', 'u u o j n o'),\n",
       " ('r l i u q b', 'r l i u d'),\n",
       " ('y y j f u s', 'y g f y u s'),\n",
       " ('o o w x g u', 'o f x o d q'),\n",
       " ('k k a k l s', 'k k a i l s'),\n",
       " ('r q l z f r', 'r q s w y'),\n",
       " ('x t n p q t', 'x n p c u'),\n",
       " ('g h i v c m', 'g h i v c'),\n",
       " ('h j g t t z', 'h j g t u c'),\n",
       " ('a d w x m l', 'a d w g m l'),\n",
       " ('c r o c p d', 'c u o c p d'),\n",
       " ('z m e k p x', 'z m e k a x'),\n",
       " ('i f b h l y', 'i f b c j q'),\n",
       " ('g w a z d n', 'g x z d o'),\n",
       " ('z c u p f u', 'z c u f s'),\n",
       " ('u g v r h l', 'f s v r p z'),\n",
       " ('r y x b g h', 'r y x g i r'),\n",
       " ('h b i w u n', 'l b w m k u'),\n",
       " ('z m e l a f', 'z m e a l r'),\n",
       " ('d o g x f z', 'd o g u f z'),\n",
       " ('f j k u m j', 'f j k o u g'),\n",
       " ('m v d n d p', 'm v d n d m'),\n",
       " ('c u i u x u', 'c u i x u c'),\n",
       " ('e h g b q r', 'e h g q r h'),\n",
       " ('v h e d m l', 'v h e d y x'),\n",
       " ('b z f h u v', 'b z f w q'),\n",
       " ('e g g p e x', 'e g s p c m'),\n",
       " ('b f a f w i', 'b a f m a w'),\n",
       " ('z g w x q k', 'z g w x d k'),\n",
       " ('m x e l g p', 'm x e y x s'),\n",
       " ('a r s c n e', 'a s c n z e'),\n",
       " ('v n i n t o', 'v n n d t r'),\n",
       " ('w z l b u i', 'w z l b u k'),\n",
       " ('o j m f w b', 'o j m f o a'),\n",
       " ('d u j n c p', 'd u j c g p'),\n",
       " ('i o c c e d', 'i o c b j c'),\n",
       " ('c k q l g k', 'c c q l e x'),\n",
       " ('s q i h q w', 's q i r q v'),\n",
       " ('l h q e x v', 'l h f e x'),\n",
       " ('u i p y m v', 'm i p y t d'),\n",
       " ('x s z f j k', 'x s z f o e'),\n",
       " ('p g i x v f', 'p g i v l f'),\n",
       " ('d x x f g r', 'd x x d g f'),\n",
       " ('q f n o l q', 'q f n o w q'),\n",
       " ('a d l n u w', 'a d l n u d'),\n",
       " ('b h w t e t', 'b h w t e'),\n",
       " ('y y p h h k', 'y p d h p k'),\n",
       " ('p g t a w v', 'p g t r a v'),\n",
       " ('c f u h a q', 'c f u h x c'),\n",
       " ('w w e c k u', 'w g c w o e'),\n",
       " ('y i c e f j', 'y i c y h x'),\n",
       " ('s v z q r z', 's v b r y k'),\n",
       " ('r k c f z v', 'r k c y x'),\n",
       " ('x w a l s m', 'x w a l s x'),\n",
       " ('f x d i i t', 'f d x i d k'),\n",
       " ('a q a e i m', 'a q a e l m'),\n",
       " ('i l z b q u', 'p z d t q e'),\n",
       " ('y o e i y u', 'y o e i y u'),\n",
       " ('v p p s s f', 'v p q s f'),\n",
       " ('w l f c r l', 'w e c r x'),\n",
       " ('u l a n a m', 'm l a l w m'),\n",
       " ('z y u c z t', 'y z t c h a'),\n",
       " ('l t f x w p', 't f t w m g'),\n",
       " ('o h p c g f', 'o h p q c j'),\n",
       " ('n a m w x i', 'n s l w m e'),\n",
       " ('t w o u k i', 't w g q r'),\n",
       " ('z p m l j q', 'z p m l j d'),\n",
       " ('x q c k u u', 'x q k a l'),\n",
       " ('n k f y b e', 'k f y n h c'),\n",
       " ('l l o b h f', 'l o t q j p'),\n",
       " ('z y s a s z', 'z y s s x f'),\n",
       " ('a w r w v f', 'a w l v q'),\n",
       " ('h t x i e z', 'h t x r e z'),\n",
       " ('w x l k o x', 'w x l o w'),\n",
       " ('q j a s c k', 'q j a s r a'),\n",
       " ('z q r r j u', 'c q r j c w'),\n",
       " ('n l n m d h', 'n o n m d h'),\n",
       " ('j s s w z i', 'j s s i r d'),\n",
       " ('x n d b q k', 'x a d q e'),\n",
       " ('a f e t p s', 'a f e c s f'),\n",
       " ('g w n e j m', 'g w e n m'),\n",
       " ('n h n q o j', 'n h n c o r'),\n",
       " ('j q y n j h', 'j q y j n o'),\n",
       " ('q a m v a p', 'm a m s v p'),\n",
       " ('w e s b q g', 'w s e q w p'),\n",
       " ('q r b a x f', 'q r b a x s'),\n",
       " ('c u x r a f', 'c l j c a f'),\n",
       " ('v m l s l o', 'v m l s w o'),\n",
       " ('k c v m y g', 'k c a m q'),\n",
       " ('l o o m g o', 'd o o d m s'),\n",
       " ('e f s z n s', 'e d s n g p'),\n",
       " ('s z z s g i', 's z s i j i'),\n",
       " ('z c y t g s', 'c l t g x'),\n",
       " ('n p c b i z', 'n q p d i'),\n",
       " ('u z u x q p', 'u z u q s'),\n",
       " ('g h v e e r', 'g h v e r'),\n",
       " ('p j x c d m', 'p j x d v'),\n",
       " ('b o x u q m', 'a o x e q v'),\n",
       " ('p p w k j q', 'p u w j q'),\n",
       " ('i c n i x j', 'g a i m h j'),\n",
       " ('d q j n q l', 'd q j q d c'),\n",
       " ('f s e n d r', 'f s f i d x'),\n",
       " ('a h h f n d', 'a h i f a c'),\n",
       " ('l y p z v g', 'y l p m v g'),\n",
       " ('f o n s m t', 'f o n x s t'),\n",
       " ('x l e x g o', 'x x e q j o'),\n",
       " ('j u a y g o', 'j q a j q r'),\n",
       " ('e t d y z m', 'e t d y w i'),\n",
       " ('j u s z g j', 'j v s z i b'),\n",
       " ('m c m e f t', 'm c m e g w'),\n",
       " ('i u f u e b', 'i u f z e q'),\n",
       " ('k b n l z c', 'z t n e c'),\n",
       " ('n h r b x r', 'n n h r x a'),\n",
       " ('s n e c b p', 'p s e q f c'),\n",
       " ('v x u n j n', 'v x y j n o'),\n",
       " ('q o j e v h', 'q r j t h d'),\n",
       " ('n p b n z p', 'n p b n t d'),\n",
       " ('p w l a k f', 'p w l a b'),\n",
       " ('f t c a c m', 'f c p c a c'),\n",
       " ('p l i a t g', 'p l i a t q'),\n",
       " ('i p y o w z', 'p y o i r z'),\n",
       " ('q f s h v r', 'q f s h s'),\n",
       " ('w g i o n h', 'w g i o h n'),\n",
       " ('q v c u c w', 'q v c u r'),\n",
       " ('m p v t i e', 'm p v i s r'),\n",
       " ('v o l d y k', 'a o c x j k'),\n",
       " ('y p x a h i', 'y p x y k z'),\n",
       " ('p r z w k a', 'p r z p r a'),\n",
       " ('g i w n p h', 'g w g n f d'),\n",
       " ('i e g l i y', 'i e b y t r'),\n",
       " ('u c z i y r', 'u c z i r'),\n",
       " ('u x u u c b', 'u x u b a'),\n",
       " ('v t t v x v', 'v t v x s'),\n",
       " ('d e x o i q', 'd e x o w'),\n",
       " ('b f m e l s', 'b f m e l o'),\n",
       " ('h n k j e j', 'h n k j b t'),\n",
       " ('e o e y w a', 'u o e y o w'),\n",
       " ('p a d d q j', 't a d q k j'),\n",
       " ('p h m q r p', 'h p m r u p'),\n",
       " ('m j f q w r', 'm j f q r a'),\n",
       " ('d t c k f t', 'd t c f k'),\n",
       " ('z o q i d g', 'z o q e d h'),\n",
       " ('i r g s v o', 'i r g w o r'),\n",
       " ('o t r d a h', 'o d t d j l'),\n",
       " ('p w q r g d', 'p w q r p d'),\n",
       " ('x x u m m u', 'x x u m g a'),\n",
       " ('p i g k r v', 'p i v a r'),\n",
       " ('o e b t c d', 'o e b c p c'),\n",
       " ('b i g v q u', 'b i v q g k'),\n",
       " ('s c r x w e', 's s c m r e'),\n",
       " ('o e s n j s', 'o e s n j l'),\n",
       " ('s c d o v s', 's c d j l h'),\n",
       " ('u h i o j q', 'u i h o c j'),\n",
       " ('s a i n p m', 'u a i n p d'),\n",
       " ('q m d i w r', 'j m b i v r'),\n",
       " ('q n c j t l', 'q n j c t b'),\n",
       " ('x c c l y b', 'x c n d l'),\n",
       " ('m o h x g s', 'm m o x v p'),\n",
       " ('r x b l k g', 'r x b l k n'),\n",
       " ('k d t z r u', 'y d t z r f'),\n",
       " ('u d f r t z', 'u d f r t u'),\n",
       " ('l d x y j f', 'l d v y j f'),\n",
       " ('e u i g a m', 'e u i g q t'),\n",
       " ('w l g b w a', 'w r g i d c'),\n",
       " ('d v j e p x', 'd l j e p x'),\n",
       " ('y l f k a f', 'y l k f a'),\n",
       " ('o v q h n v', 'o v q u n'),\n",
       " ('d b m h s x', 'o z m h g a'),\n",
       " ('x l v g v n', 'x x k h a p'),\n",
       " ('d c w n p e', 'd w c n z e'),\n",
       " ('s s t w u s', 's f z d x s'),\n",
       " ('e y s x x d', 'e s s x m'),\n",
       " ('q y u f a j', 'q u k f i a'),\n",
       " ('c e w s n w', 'c e w j a'),\n",
       " ('u g h v s i', 'z g h v s i'),\n",
       " ('o b w b f y', 'o b w t j'),\n",
       " ('l d o b p q', 'n d o b f p'),\n",
       " ('q r w r a a', 'q r w m d p'),\n",
       " ('c s k b o g', 'c s k b m o'),\n",
       " ('b b u g g n', 'b b u g j p'),\n",
       " ('k f h p f e', 'k f h p w v'),\n",
       " ('f h a r h s', 'h j r b v n'),\n",
       " ('b i s j c y', 'b i s j c d'),\n",
       " ('t k k f t k', 'f k f a t p'),\n",
       " ('k l n q z g', 'k r z l q g'),\n",
       " ('w k q q u x', 'w k q q k x'),\n",
       " ('z w q f u w', 'z w m q w e'),\n",
       " ('u v d t b q', 'u v s t b x'),\n",
       " ('a p u q w m', 'a p u q m w'),\n",
       " ('f v e p q w', 'f v f w g u'),\n",
       " ('t j s y g h', 't s j y h'),\n",
       " ('l o c y r y', 'l o a f l p'),\n",
       " ('e b q d d z', 'j b q d v s'),\n",
       " ('i y k h s f', 'i y k h s m'),\n",
       " ('p s j r h j', 'v s p r t v'),\n",
       " ('e n c y a v', 'e n c y t'),\n",
       " ('c x s z c v', 'c x s z c v'),\n",
       " ('a h r o e n', 'a h r e o n'),\n",
       " ('v d h e m i', 'v d g e m d'),\n",
       " ('f w y o f z', 'f w r o f z'),\n",
       " ('e h h b l a', 'e h b l w s'),\n",
       " ('i p f s o g', 'c i f s o a'),\n",
       " ('q q f l t y', 'q a f l g'),\n",
       " ('o r o r y c', 'o r j o b'),\n",
       " ('x r x f w y', 'x r f w r v'),\n",
       " ('f t e v w r', 'f t v u r c'),\n",
       " ('d t s t h b', 'h t u m h'),\n",
       " ('p r w e h u', 'p r w r v q'),\n",
       " ('m d j a g f', 'm c j x j f'),\n",
       " ('k e c b y x', 'l e b y x'),\n",
       " ('d a c l c t', 'd a n c h'),\n",
       " ('m q h h a t', 'm h q o a c'),\n",
       " ('i i s c i v', 'i c h i a c'),\n",
       " ('w h v j p f', 'w h c j p f'),\n",
       " ('g t f r n e', 'y t f r x g'),\n",
       " ('d v w o b d', 'd d w o w b'),\n",
       " ('t i o m q u', 't i o d m u'),\n",
       " ('u s d j x u', 'u s d l x a'),\n",
       " ('p d v r s i', 'p d v s r t'),\n",
       " ('v u i a l d', 'v i u a l'),\n",
       " ('w v y y x v', 'd j y y t w'),\n",
       " ('d m h q v w', 'g m h q v s'),\n",
       " ('u m f u x c', 'u h f u c'),\n",
       " ('m o p g h v', 'm o p g v h'),\n",
       " ('g l j y r y', 'g l j r d e'),\n",
       " ('t n b f r o', 't n y b r x'),\n",
       " ('h s d l f r', 'h s i l s f'),\n",
       " ('z e i o k u', 'z e i o k'),\n",
       " ('r i t g c w', 'r i g c w g'),\n",
       " ('t l z a o g', 's e a o w e'),\n",
       " ('i i l m k u', 'i i l o s'),\n",
       " ('f p g h n c', 'f p s g c h'),\n",
       " ('x h z o t z', 'x z h t w f'),\n",
       " ('r k h m i s', 'r k h i s r'),\n",
       " ('b c f n c f', 'b l f c s d'),\n",
       " ('z v c d e z', 'z v c d u n'),\n",
       " ('s v y z d n', 's m y z d p'),\n",
       " ('q a z e z i', 'q a z e i s'),\n",
       " ('p y o z e r', 'p y p o k z'),\n",
       " ('s a a a e s', 's a a u s n'),\n",
       " ('l i m i i b', 'l i m a i h'),\n",
       " ('s a a j y p', 's a w j l'),\n",
       " ('l f i m e h', 'l m i f v r'),\n",
       " ('k v b l j h', 'k d b l j x'),\n",
       " ('o o n p i a', 'o s n o u t'),\n",
       " ('v t n k f v', 'v t n f k'),\n",
       " ('b p t u z a', 'b p q u z'),\n",
       " ('f r p q f x', 'f r b c u d'),\n",
       " ('b a q f d j', 'b a q m h d'),\n",
       " ('z b w u y d', 'z b w e q'),\n",
       " ('c f o v a r', 'c o a x v k'),\n",
       " ('w u q h i w', 'w u q h i w'),\n",
       " ('l z g z a u', 'l z w g k w'),\n",
       " ('f v x v t v', 'f v c z t e'),\n",
       " ('l l o u z y', 'l o l u d n'),\n",
       " ('h r w l h d', 'h r n l d g'),\n",
       " ('u t b g l p', 'u t b g l p'),\n",
       " ('o r t v t r', 'r o y x k'),\n",
       " ('t y w w b h', 'c u w b z v'),\n",
       " ('j q f x k y', 'j q f c u'),\n",
       " ('m n q r i m', 'm n q a w'),\n",
       " ('j l d i i y', 'j l b i v l'),\n",
       " ('v s r d y l', 'k s r d y l'),\n",
       " ('o q o p e e', 'o q o p e g'),\n",
       " ('k u c z y a', 'k e c z n p'),\n",
       " ('v v u m r t', 'v v u r d t'),\n",
       " ('o g c t i j', 'o g c y i j'),\n",
       " ('i e q r d l', 'i e i q r s'),\n",
       " ('i y y v t h', 'i y y i h h'),\n",
       " ('j c s k k r', 'j c s q k n'),\n",
       " ('y p h n q c', 'y p h n q c'),\n",
       " ('u p w w s v', 'u p w r v g'),\n",
       " ('w q c w v j', 'w b c r v x'),\n",
       " ('j f m z a a', 'j f o d a n'),\n",
       " ('z d e z i o', 'z d e m i s'),\n",
       " ('h g c u m g', 'h g c u m g'),\n",
       " ('g p p f i d', 'g p e r d t'),\n",
       " ('u e o h d g', 'e u o h d g'),\n",
       " ('b h j v y w', 'b h j u r x'),\n",
       " ('s a m q r d', 's a m q e d'),\n",
       " ('k s s y o k', 'k s s u o'),\n",
       " ('m u f h p z', 'm u f d p a'),\n",
       " ('t d b a e f', 't g m b a j'),\n",
       " ('g m w v q g', 'g m w q g q'),\n",
       " ('v j v o l j', 'j j o v r u'),\n",
       " ('d s t c a b', 'd s t c u b'),\n",
       " ('h j c j i w', 'h j c m e i'),\n",
       " ('r a y z p t', 'r r f p a c'),\n",
       " ('f z l v r j', 'f y l o r g'),\n",
       " ('o d u c n x', 'o d q c h g'),\n",
       " ('a z t v e j', 'z t v m e j'),\n",
       " ('r y c k n n', 'r y c p z c'),\n",
       " ('u v e q e j', 'u v e q e j'),\n",
       " ('w v t t c u', 'w t j o t b'),\n",
       " ('v o u y k m', 'v o y e o v'),\n",
       " ('s x e p z h', 's x b k z'),\n",
       " ('k y f y k d', 'k y l i s c'),\n",
       " ('z b u q x c', 'z b q s v c'),\n",
       " ('j j w c m o', 'j t m c w o'),\n",
       " ('b n p e z d', 'b v p e y'),\n",
       " ('f o q j o k', 'f o q f w k'),\n",
       " ('l w c t d z', 'l w c m z i'),\n",
       " ('o u q u g h', 'z y u d f z'),\n",
       " ('d t c c b c', 'd t c b a c'),\n",
       " ('f b k g g a', 'f b k r m a'),\n",
       " ('p q g v g t', 'p q v g z'),\n",
       " ('c u f m a u', 'u u f o a'),\n",
       " ('t p z c m g', 't z t c m g'),\n",
       " ('v s c q z a', 'v s b l a d'),\n",
       " ('m a m m u e', 'm a h m b s'),\n",
       " ('i t i b k b', 'i t b k g l'),\n",
       " ('v j p q e f', 'v j q p v e'),\n",
       " ('k f s t o x', 'q f s t o a'),\n",
       " ('r m e a x m', 'r m e a x'),\n",
       " ('l u n v w a', 'n u n d t'),\n",
       " ('p b i j p d', 'o b z p v'),\n",
       " ('j m b d q j', 'j m b d w s'),\n",
       " ('c q a s c c', 'c q a j c h'),\n",
       " ('u m i m i s', 'u m i m k s'),\n",
       " ('r p x z s k', 'y p m z s k'),\n",
       " ('b y i t v m', 'b y i t m a'),\n",
       " ('k u r x s w', 'k u s n s d'),\n",
       " ('o l u n k q', 'o l u n i d'),\n",
       " ('c j b t r o', 'q j b t r o'),\n",
       " ('p w n k f j', 'p w m n j'),\n",
       " ('b w n f w h', 'b n w f g e'),\n",
       " ('v p v i y r', 'v p v p r c'),\n",
       " ('d a p p w f', 'c a p o v b'),\n",
       " ('c t n q b c', 'c t n q g'),\n",
       " ('k o q c b p', 'k o q c x'),\n",
       " ('o c q c c h', 'o c q v c'),\n",
       " ('e z p k w n', 'b z e d k a'),\n",
       " ('x g j q y k', 'x g j q y k'),\n",
       " ('f g x h m c', 'f g y h i c'),\n",
       " ('c i d r t o', 'c i d l a'),\n",
       " ('i x d i p c', 'i x d i k c'),\n",
       " ('j f j g s j', 'k j v l g w'),\n",
       " ('t k n k h o', 't k n m h'),\n",
       " ('h q y k p m', 'h q y k p a'),\n",
       " ('b f k u a t', 'b f k u a p'),\n",
       " ('f z v g b u', 'f z v h g w'),\n",
       " ('b n p d n f', 'b n p d g'),\n",
       " ('y i p o u l', 'y i p r w c'),\n",
       " ('t t s d z x', 't t s d j i'),\n",
       " ('n o k y g z', 'n o k j z q'),\n",
       " ('p j i w r v', 'p i w d t e'),\n",
       " ('f b x m u q', 'b f x q a c'),\n",
       " ('l x y x n o', 't x y x g o'),\n",
       " ('b t u w e d', 'w x y s f c'),\n",
       " ('t m j d e a', 't m j d a i'),\n",
       " ('d f c g h a', 'q f c g w p'),\n",
       " ('q o e x i h', 'q o e n j h'),\n",
       " ('b n j o p a', 'b j m p a n'),\n",
       " ('k m u v h u', 'y m u d d t'),\n",
       " ('w k l d a x', 'w k d a l i'),\n",
       " ('h f g r c l', 'h g f r c w'),\n",
       " ('z j i u f s', 'z j i u f k'),\n",
       " ('u a v b w k', 'u v a b m k'),\n",
       " ('h w n g f w', 'h w n e d'),\n",
       " ('e d m n x k', 'e d m n j p'),\n",
       " ('x q d w b a', 'x q w d c z'),\n",
       " ('j y m q t t', 'j y j j t b'),\n",
       " ('r r w e h k', 'r r n e d o'),\n",
       " ('l m b l j x', 'l f l b a l'),\n",
       " ('e a y g e n', 'e a y e w q'),\n",
       " ('v w r f i l', 'v j r i f c'),\n",
       " ('g q a n z e', 'v q a n h c'),\n",
       " ('q r i k k y', 'q o r k o r'),\n",
       " ('c l o d t c', 'c l o j d t'),\n",
       " ('l x f y f h', 'l x y f p'),\n",
       " ('d o a c s r', 'd o a c s h'),\n",
       " ('d k l o d e', 'w k l o v n'),\n",
       " ('q c h w e z', 'q c h w t'),\n",
       " ('u m n c r f', 'u n d t r j'),\n",
       " ('j s j r w n', 'j s e b a c'),\n",
       " ('i f n b n a', 'i f n b y c'),\n",
       " ('d s s f e f', 'd s s f b t'),\n",
       " ('g t o q w c', 'g g o q r c'),\n",
       " ('p a i x c i', 'p a i f c o'),\n",
       " ('m i f e z x', 'm i f z x'),\n",
       " ('h e d s c g', 'h b e r c g'),\n",
       " ('z k b s d l', 'z l b s f t'),\n",
       " ('y r m h u u', 'b r m h u r'),\n",
       " ('y l a m u w', 'y l a m k u'),\n",
       " ('z h x t i w', 'z h x t i'),\n",
       " ('b v a j x a', 'b t l j x'),\n",
       " ('m t f b z a', 'm t f g z'),\n",
       " ('t x v j n i', 't x v j i z'),\n",
       " ('e f e a c s', 'e w e x a c'),\n",
       " ('c c u l i h', 'c c u b t'),\n",
       " ('g h e y j n', 'g h e y j n'),\n",
       " ('g i q e y g', 'g i q e q r'),\n",
       " ('b n f l q y', 'm n f l q s'),\n",
       " ('u c n d k c', 'u n c d r'),\n",
       " ('e s i u b p', 'e s i u f z'),\n",
       " ('q n d m n y', 'q w f d n l'),\n",
       " ('k f k y o y', 'k k f o l'),\n",
       " ('j p k b s h', 'j p r q y e'),\n",
       " ('f z j t h k', 'f z j t d k'),\n",
       " ('j n s e h y', 'j v s e h m'),\n",
       " ('j c b g k d', 'j k b q k a'),\n",
       " ('h u t j r e', 'h u n o r e'),\n",
       " ('j v l d n q', 'j q f d c'),\n",
       " ('p z x o l a', 'e z x k z x'),\n",
       " ('e d n u k y', 'd e p r v l'),\n",
       " ('b e h b s m', 'b b l k g x'),\n",
       " ('d b g d x y', 'd g b d v l'),\n",
       " ('g g r k w n', 'g g u h o n'),\n",
       " ('n n c j b y', 'n n c e q g'),\n",
       " ('e r j q b e', 'e r j a x h'),\n",
       " ('d g c v v e', 'd c g v p r'),\n",
       " ('r q w e e q', 'r q w e z q'),\n",
       " ('u r t o a d', 'u r t a d p'),\n",
       " ('x p u x j l', 'x p u j x'),\n",
       " ('f o j n b l', 'z o j b n k'),\n",
       " ('v p w h g r', 'v p w h q w'),\n",
       " ('q a w z r u', 'q a w r g u'),\n",
       " ('x i l s p q', 'x i s y p d'),\n",
       " ('a f m f z s', 'a w f i y x'),\n",
       " ('z d f c i t', 'z d f o i a'),\n",
       " ('y f a j u f', 'y f a g f r'),\n",
       " ('n y z x o i', 'r y s i r x'),\n",
       " ('a e y h z l', 'a y u h z c'),\n",
       " ('f w u g c g', 'f w z q c n'),\n",
       " ('c s l a v w', 's c l a d'),\n",
       " ('n b d k m o', 'n b d k m o'),\n",
       " ('y j i i f g', 'y a w m g j'),\n",
       " ('i n n k k f', 'i c r n k t'),\n",
       " ('i y l y q t', 'i y l t q k'),\n",
       " ('t x o b s k', 't x s g d k'),\n",
       " ('y u t p c f', 'y u d p r v'),\n",
       " ('e a g m b s', 'e z g m e z'),\n",
       " ('p h t z u n', 'p h t u d c'),\n",
       " ('y i e e a v', 'y i e r a x'),\n",
       " ('r e m i x w', 'r e m i s l'),\n",
       " ('h y l r h u', 'h y l h r w'),\n",
       " ('t b n s c v', 't b n s c w'),\n",
       " ('u q y w x w', 'u d y w d e'),\n",
       " ('m z a o m f', 'm p o a m f'),\n",
       " ('s x m h m f', 's t x h m p'),\n",
       " ('h z n o v j', 'h n z e m g'),\n",
       " ('m c v z z y', 'm c z d y p'),\n",
       " ('z z c n i t', 'z z c i s i'),\n",
       " ('o m z y s n', 'o q z y h p'),\n",
       " ('i p i h t q', 'p u e o q w'),\n",
       " ('r z x q g v', 'r z v p g v'),\n",
       " ('v x r t o i', 'v x r t d'),\n",
       " ('s t o u f f', 's i o y e d'),\n",
       " ('x y e z f s', 'x e y e h p'),\n",
       " ('d d i q o z', 'd i d m o u'),\n",
       " ('y a k w k j', 'y a k h a w'),\n",
       " ('j y p g u r', 'j y p q u n'),\n",
       " ('f v a e s n', 'f v s e r x'),\n",
       " ('h u j z k i', 'h j u h j i'),\n",
       " ('b y u y f w', 'b y u f o u'),\n",
       " ('m v d m a f', 't v a d l n'),\n",
       " ('r n d z w h', 'r n d y g w'),\n",
       " ('f t m b d t', 'h f m a f k'),\n",
       " ('g e a c p q', 'g w a s x e'),\n",
       " ('n t f w i a', 'n t w f k a'),\n",
       " ('h r v y n y', 'h r v y n p'),\n",
       " ('q p g z i y', 'q p g k i m'),\n",
       " ...]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "translation_results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6706a81c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
